﻿using System;
using System.Diagnostics;
using System.Globalization;
using System.Runtime.InteropServices;
using System.ComponentModel.Design;
using Microsoft.Win32;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.Shell;

using IOleServiceProvider = Microsoft.VisualStudio.OLE.Interop.IServiceProvider;
using IOleComponentManager = Microsoft.VisualStudio.OLE.Interop.IOleComponentManager;
using Microsoft.VisualStudio.TextManager.Interop;

namespace PovTeam.Pkg_PovrayProject
{
    /// <summary>
    /// This is the class that implements the package exposed by this assembly.
    ///
    /// The minimum requirement for a class to be considered a valid package for Visual Studio
    /// is to implement the IVsPackage interface and register itself with the shell.
    /// This package uses the helper classes defined inside the Managed Package Framework (MPF)
    /// to do it: it derives from the Package class that provides the implementation of the 
    /// IVsPackage interface and uses the registration attributes defined in the framework to 
    /// register itself and its components with the shell.
    /// </summary>
    // This attribute tells the PkgDef creation utility (CreatePkgDef.exe) that this class is
    // a package.
    [PackageRegistration(UseManagedResourcesOnly = true)]
    // This attribute is used to register the informations needed to show the this package
    // in the Help/About dialog of Visual Studio.
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
    [ProvideProjectFactory(typeof(PovrayProjectFactory), "Povray Scene", "Povray Scene Projects (*.povproj); *.povproj", "povproj", "povproj", @"Templates\Projects\PovrayProject", LanguageVsTemplate="PovrayProject")]
    [ProvideLanguageService(GuidList.guidPkg_PovrayLanguageServiceString, "Pov-Ray SDL", 113, ShowCompletion=true, QuickInfo=true)]
    [ProvideLanguageExtension(typeof(PovLanguageService), ".pov")]
    [ProvideLanguageExtension(typeof(PovLanguageService), ".inc")]
    [ProvideOptionPage(typeof(PovrayDirectoriesConfigPage), "Pov-Ray Settings", "Directories", 0, 0, true, SupportsProfiles=true)]
    [Guid(GuidList.guidPkg_PovrayProjectPkgString)]
    public sealed class Pkg_PovrayProjectPackage : Package
    {


        uint m_componentID;

        /// <summary>
        /// Default constructor of the package.
        /// Inside this method you can place any initialization code that does not require 
        /// any Visual Studio service because at this point the package object is created but 
        /// not sited yet inside Visual Studio environment. The place to do all the other 
        /// initialization is the Initialize method.
        /// </summary>
        public Pkg_PovrayProjectPackage()
        {
            Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering constructor for: {0}", this.ToString()));
        }

        public IServiceProvider ServiceProvider
        {
            get
            {
                return ((IServiceProvider)this);
            }
        }

        /////////////////////////////////////////////////////////////////////////////
        // Overriden Package Implementation
        #region Package Members

        /// <summary>
        /// Initialization of the package; this method is called right after the package is sited, so this is the place
        /// where you can put all the initilaization code that rely on services provided by VisualStudio.
        /// </summary>
        protected override void Initialize()
        {
            Trace.WriteLine (string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this.ToString()));
            base.Initialize();

            IServiceContainer container = (IServiceContainer)this;
            container.AddService(typeof(PovLanguageService), new PovLanguageService(this), true);

            PovrayProjectFactory factory = new PovrayProjectFactory(this);          
            
            this.RegisterProjectFactory(factory);

//             IOleComponentManager mgr = GetService(typeof(Microsoft.VisualStudio.OLE.Interop.SOleComponentManager))
//                                          as IOleComponentManager;
//             if (m_componentID == 0 && mgr != null)
//             {
//                 Microsoft.VisualStudio.OLE.Interop.OLECRINFO[] crinfo = new Microsoft.VisualStudio.OLE.Interop.OLECRINFO[1];
//                 crinfo[0].cbSize = (uint)Marshal.SizeOf(typeof(Microsoft.VisualStudio.OLE.Interop.OLECRINFO));
//                 crinfo[0].grfcrf = (uint)Microsoft.VisualStudio.OLE.Interop._OLECRF.olecrfNeedIdleTime |
//                                               (uint)Microsoft.VisualStudio.OLE.Interop._OLECRF.olecrfNeedPeriodicIdleTime;
//                 crinfo[0].grfcadvf = (uint)Microsoft.VisualStudio.OLE.Interop._OLECADVF.olecadvfModal |
//                                               (uint)Microsoft.VisualStudio.OLE.Interop._OLECADVF.olecadvfRedrawOff |
//                                               (uint)Microsoft.VisualStudio.OLE.Interop._OLECADVF.olecadvfWarningsOff;
//                 crinfo[0].uIdleTimeInterval = 1000;
//                 int hr = mgr.FRegisterComponent(this, crinfo, out m_componentID);
//             }

            

        }

        #endregion


        //#region IOleComponent Members

        //public int FContinueMessageLoop(uint uReason, IntPtr pvLoopData, Microsoft.VisualStudio.OLE.Interop.MSG[] pMsgPeeked)
        //{
        //    return VSConstants.S_OK;
        //}

        //public int FDoIdle(uint grfidlef)
        //{
        //    return VSConstants.S_OK;
        //}

        //public int FPreTranslateMessage(Microsoft.VisualStudio.OLE.Interop.MSG[] pMsg)
        //{
        //    return VSConstants.S_OK;
        //}

        //public int FQueryTerminate(int fPromptUser)
        //{
        //    return VSConstants.S_OK;
        //}

        //public int FReserved1(uint dwReserved, uint message, IntPtr wParam, IntPtr lParam)
        //{
        //    return VSConstants.S_OK;
        //}

        //public IntPtr HwndGetWindow(uint dwWhich, uint dwReserved)
        //{
        //    return IntPtr.Zero;
        //}

        //public void OnActivationChange(Microsoft.VisualStudio.OLE.Interop.IOleComponent pic, int fSameComponent, Microsoft.VisualStudio.OLE.Interop.OLECRINFO[] pcrinfo, int fHostIsActivating, Microsoft.VisualStudio.OLE.Interop.OLECHOSTINFO[] pchostinfo, uint dwReserved)
        //{
        //}

        //public void OnAppActivate(int fActive, uint dwOtherThreadID)
        //{
        //}

        //public void OnEnterState(uint uStateID, int fEnter)
        //{
        //}

        //public void OnLoseActivation()
        //{
        //}

        //public void Terminate()
        //{
        //}

        //#endregion
    }
}
